# -*- coding: utf-8 -*-
__author__ = 'lztkdr'
__date__ = '2020/11/23 16:26'

"""
    __new__()方法, 对象创建的过程，
    1- new方法返回一个对象
    2- init利用new返回的对象进行属性的添加
"""


class Person(object):

	# 监听创建一个实例对象的过程，需要返回一个对象赋值给xiaoming
	# new中不return的话，那么就不会执行init方法
	def __new__(cls, *args, **kwargs):
		print("new")
		print((object.__new__(cls)))
		return object.__new__(cls)

	# 构造方法，当执行init方法的时候对象**已经创建成功**，剩下的是将属性添加到对象中
	def __init__(self, name):
		print("init")
		self.name = name

	# 类的toString方法
	# def __str__(self):
	#     return "我的名字是: %s" % self.name

	# 监听引用计数为0的时候，python会执行del方法
	def __del__(self):
		print("再见")


# xioaming的地址和new中return的obj的地址一样，说明new中返回的obj就是xiaoming
xiaoming = Person("小明")
print(xiaoming)
print('------------------------------------')

"""
    python的单例模式，需要使用到new关键方法
    1- 保证返回的对象是同一个，在new中修改
    2- 保证对象的属性只能赋值一次，在init方法中修改
    3- 一般单例模式中的包含静态方法， 类似于Tools.XX, 不需要创建多个对象来调用同一个静态方法
"""


class Student(object):
	# 定义一个类属型保存实例对象
	__instance = None

	# 类属型保证实例属性只能被赋值一次
	__is_first = True

	# s1,s2要保证使用一份内存， 需要new的时候返回同一个对象
	def __new__(cls, *args, **kwargs):
		if cls.__instance is None:
			cls.__instance = object.__new__(cls)

		return cls.__instance

	def __init__(self, name, age):
		if self.__is_first:
			self.name = name
			self.age = age
			self.__is_first = False

	# 静态方法
	@staticmethod
	def add_num(a, b):
		return a + b


s1 = Student("小明", 25)
s2 = Student("小红", 28)

print(s1)
print(s2)
print(s1.name)
print(s2.name)
